VTK 是一个出色的可视化工具包,并且有了 Python 绑定,它应该能够结合 C++ 的速度和 Python 的快速原型开发能力。然而,尽管如此,用 Python 编写的 VTK 代码通常看起来与其 C++ 对应代码相同。本模块试图简化网格创建和绘图,同时不丢失功能。
比较两种从文件加载和绘制表面网格的方法:
使用 Python 的 VTK 绘制网格
以本示例为基线,仅使用 vtk 库加载和绘制 STL 文件需要大量代码。而 PyVista 只需要几行代码。
. PyVista 另一方面只需要几行代码。
| 使用 vtk 读取并绘制 STL 文件 | 使用 PyVista 读取 STL 文件 |
|---|---|
import vtk
reader = vtk.vtkSTLReader()
reader.SetFileName("bunny.stl")
mapper = vtk.vtkDataSetMapper()
output_port = reader.GetOutputPort()
mapper.SetInputConnection(output_port)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
style = vtk.vtkInteractorStyleTrackballCamera()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(style)
ren.AddActor(actor)
iren.Initialize()
renWin.Render()
iren.Start()
del iren, renWin |
import pyvista as pv
mesh = pv.read('bunny.stl')
mesh.plot() |
PyVista 数据模型和 API 允许您快速加载网格,并处理许多“粗活”,例如设置绘图、连接类和管线以及清理绘图窗口。它通过向 VTK 的类暴露一个简化但功能性的接口来实现这一点。
在 pyvista.read() 中,PyVista 根据文件扩展名自动确定正确的文件读取器,并返回一个 DataSet 对象。该数据集对象包含 pyvista.PolyData 类可用的所有方法,包括 plot 方法,允许您即时生成网格图。垃圾回收自动处理,并且在用户关闭绘图窗口后渲染器被清理。
有关比较两种 API 的更多详细信息,请参阅 PyVista 数据模型 和 从 VTK 过渡到 PyVista。
PyVista API
例如,VTK 中的三角表面网格可以细分,但 VTK 中的每个其他对象都不能。因此,将 pyvista.PolyDataFilters.subdivide() 方法添加到现有的三角表面网格是有意义的。这样,细分可以通过如下方式执行:
import pyvista as pv
mesh = pv.Plane().triangulate()
submesh = mesh.subdivide(2, 'linear')
submesh.plot(show_edges=True)
此外,PyVista 中所有方法的文档字符串旨在用于交互式编码会话。这允许用户在运行时使用复杂的处理例程,并立即访问有关如何使用这些方法的描述:
from pyvista import examples
[1]: mesh = examples.load_ant()
mesh
PolyData Information
[1]:
N Cells 912
N Points 486
X Bounds -1.601e+01,1.601e+01
Y Bounds -9.385e+00,9.385e+00
Z Bounds -1.678e+01,1.678e+01
0 N Arrays
submesh = mesh. []:
与其他库的接口
PyVista 严重依赖 numpy,并使用它表示来自 VTK 网格的点、单元、字段和其他数据。这些数据可以轻松地从数据集属性(如 pyvista.DataSet.points)访问。例如,可以通过以下方式访问 PyVista 中圆的前 10 个点:
circle = pv.Circle()
circle.points[:10]
并且这些点可以像操作 NumPy 数组一样操作,而不会丢失与底层 VTK 数据数组的连接。
同时,可以直接从 numpy 数组生成各种 PyVista 对象。例如,下面我们使用 numpy.meshgrid() 生成箭头向量场:
import pyvista as pv
import numpy as np
# 制作一个网格
x, y, z = np.meshgrid(np.linspace(-5, 5, 20),
np.linspace(-5, 5, 20),
np.linspace(-5, 5, 5),
indexing='ij')
points = np.empty((x.size, 3))
points[:, 0] = x.ravel('F')
points[:, 1] = y.ravel('F')
points[:, 2] = z.ravel('F')
# 计算向量场的方向
direction = np.sin(points)**3
# 使用绘图类绘制
pl = pv.Plotter()
pl.add_arrows(points, direction, 0.5)
pl.show()
PyVista 与多个其他库有连接,例如 meshio 和 matplotlib,允许 PyVista 用 Python 生态系统的功能扩展 VTK。